package com.wei.czz.framework.common.controller;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.AuthLogin;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.common.exportTask.ExportTaskDto;
import com.wei.czz.common.jsr303.group.OrderSearch;
import com.wei.czz.common.property.BatchProperty;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.common.exportTask.ExportTaskVo;
import com.wei.czz.common.vo.common.exportTask.ExportFormVo;
import com.wei.czz.framework.common.manager.ExportTaskManager;
import com.wei.czz.framework.common.service.ExportTaskService;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-03-19 14:09:19
 * className: ExportTaskController 系统文件导出请求操作接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("common/export-task")
@AllArgsConstructor
public class ExportTaskController {

    private static final Logger log = LoggerFactory.getLogger(ExportTaskController.class);

    private final BatchProperty batchProperty;

    private final ExportTaskService exportTaskService;

    private final ExportTaskManager exportTaskManager;

    /**
     * 添加导出任务接口
     * <p>
     * 此接口会校验是否重复提交
     * @param exportTaskVo 参数对象
     * @return 结果
     */
    @Resubmit(message = "添加导出任务")
    @PostMapping("/add")
    @AuthLogin
    public Result<String> addExportTask(@Validated @RequestBody ExportTaskVo exportTaskVo) {
        log.info("开始添加导出任务业务。{}", exportTaskVo);

        String taskId = exportTaskManager.addExportTask(exportTaskVo);

        log.info("添加导出任务业务结束");
        return Result.success(taskId);
    }

    /**
     * 分页查询用户导出任务列表接口
     * 根据导出任务请求参数对象，分页查询用户的导出任务列表
     * <p>
     * 调用方：
     *  1、浏览器-后台管理-我的下载页面调用
     *
     * @param exportFormVo 导出任务请求参数对象
     * @return 请求结果
     */
    @PostMapping("/list")
    @Auth(permit = "export:task:list")
    public Result<PageDto<ExportTaskDto>> getExportTaskList(
            @Validated(OrderSearch.class) @RequestBody ExportFormVo exportFormVo) {
        log.info("开始分页查询用户导出任务列表业务。{}", exportFormVo);

        if (exportFormVo.getCreateTime1() != null && exportFormVo.getCreateTime2() != null
            && exportFormVo.getCreateTime1().compareTo(exportFormVo.getCreateTime2()) > 0) {
            log.info("分页查询用户导出任务列表接口，创建时间开始时间大于结束时间");
            return Result.paramFail();
        }

        PageDto<ExportTaskDto> pageDto = exportTaskService.getExportTaskList(exportFormVo);

        log.info("分页查询用户导出任务列表业务结束");
        return Result.success(pageDto);
    }

    /**
     * 文件下载接口
     * 根据导出任务主键值，下载导出任务关联的文件
     * <p>
     * 调用方：
     *  1、浏览器-后台管理-我的下载页面调用
     * <p>
     * 此接口会校验是否重复提交
     * @param taskId 导出任务主键值
     * @return 请求结果
     */
    @Resubmit(message = "下载文件")
    @GetMapping("/download")
    @Auth(permit = "export:task:download")
    public Result<Object> downloadFile(@RequestParam("taskId") Long taskId, HttpServletRequest request,
                                       HttpServletResponse response) {
        log.info("开始文件下载业务。taskId={}", taskId);

        exportTaskService.downloadFile(taskId, request, response);

        log.info("文件下载业务结束");
        return null;
    }

    /**
     * 删除导出任务接口
     * 根据导出任务id列表，批量变更导出任务的删除标记信息
     * <p>
     * 调用方：
     *  1、浏览器-后台管理-我的下载页面调用
     * <p>
     * 此接口会校验是否重复提交
     * @param taskIdList 导出任务主键列表
     * @return 请求结果
     */
    @Resubmit(message = "删除导出任务")
    @DeleteMapping("/delete")
    @Auth(permit = "export:task:delete")
    public Result<Object> deleteExportTask(@RequestBody List<Long> taskIdList) {
        log.info("开始删除导出任务业务。taskIdList={}", taskIdList);
        if (taskIdList.isEmpty()) {
            return Result.clientFail("导出任务主键列表不能为空");
        }
        if (batchProperty.getMaxSize() < taskIdList.size()) {
            log.warn("删除导出任务数量超限。batch.size={} size={}", batchProperty.getMaxSize(), taskIdList.size());
            return Result.clientFail("一次删除最多允许同时删除" + batchProperty.getMaxSize() + "条数据");
        }
        exportTaskService.deleteExportTask(taskIdList);

        log.info("删除导出任务业务结束");
        return Result.success();
    }
}
